package com.urbane.product.aspect;

import io.urbane.auth.util.UserContext;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * 商品操作审计切面
 * 功能：
 *   - 拦截所有商品管理操作（创建、更新、上下架）
 *   - 记录操作人、IP、操作类型、影响的商品
 *   - 写入审计日志，便于追溯和风控
 *
 * 注意：
 *   - 仅对 AdminController 的方法生效
 *   - 日志中自动携带 traceId、userId
 */
@Slf4j
@Aspect
@Component
public class ProductAuditAspect {

    @Around("@annotation(com.urbane.product.annotation.AdminOperation)")
    public Object logProductOperation(ProceedingJoinPoint joinPoint) throws Throwable {
        String methodName = joinPoint.getSignature().getName();
        Long userId = UserContext.getUser(); // 从 ThreadLocal 获取当前管理员ID
        String ip = getCurrentIp(); // 从 HttpServletRequest 获取

        log.info("【商品审计】{} | userId={} | ip={}", methodName, userId, ip);

        try {
            Object result = joinPoint.proceed();
            log.info("【商品审计成功】{} | userId={}", methodName, userId);
            return result;
        } catch (Exception e) {
            log.warn("【商品审计失败】{} | userId={} | error={}", methodName, userId, e.getMessage());
            throw e;
        }
    }

    private String getCurrentIp() {
        // 实际项目中通过 RequestContextHolder 获取 HttpServletRequest
        return "127.0.0.1";
    }
}